package mysql

import (
	"bluebell/settings"
	"fmt"
	_ "github.com/go-sql-driver/mysql" // 引包但不直接使用,执行包中的init()
	"github.com/jmoiron/sqlx"
	"strconv"
	"strings"
)

var db *sqlx.DB // 定义一个数据库对象

func Init(cfg *settings.MySQLConfig) (err error) { // 初始化数据库连接
	s1 := cfg.User
	s2 := ":"
	s3 := cfg.Password
	s4 := "@tcp("
	s5 := cfg.Host
	s6 := ":"
	s7 := strconv.Itoa(cfg.Port)
	s8 := ")/"
	s9 := cfg.DbName
	s10 := "?charset=utf8mb4&parseTime=True&loc=Local"
	var build strings.Builder
	build.WriteString(s1)
	build.WriteString(s2)
	build.WriteString(s3)
	build.WriteString(s4)
	build.WriteString(s5)
	build.WriteString(s6)
	build.WriteString(s7)
	build.WriteString(s8)
	build.WriteString(s9)
	build.WriteString(s10)
	dsn := build.String()
	// 连接数据库参数(sqlx库格式化时间:parseTime=True,时区loc=Local本地,这样就可以在model结构体中使用time.Time类型)
	//dsn := "root:123321@tcp(127.0.0.1:3306)/sql_demo?charset=utf8mb4&parseTime=True&loc=Local"
	db, err = sqlx.Connect("mysql", dsn) // 连接数据库(真正连接数据库)
	if err != nil {
		fmt.Println("连接数据库失败")
		panic(err) // 退出程序
		return
	}

	// db.SetConnMaxLifetime(time.Second * 10) // 连接过期时间,一般不设置
	db.SetMaxOpenConns(cfg.MaxOpenConns) // 最大连接数,默认0(无限制)
	db.SetMaxIdleConns(cfg.MaxIdleConns) // 最大空闲连接数
	return
}

func Close() {
	err := db.Close()
	if err != nil {
		fmt.Println("close mysql connect failed")
	}
}
